package com.bxait.toymail.ware.listener;

import com.bxait.com.to.mq.OrderTo;
import com.bxait.com.to.mq.StockLockedTo;
import com.bxait.toymail.ware.service.WareSkuService;
import lombok.extern.slf4j.Slf4j;
import org.springframework.amqp.rabbit.annotation.RabbitHandler;
import org.springframework.amqp.rabbit.annotation.RabbitListener;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Service;
import com.rabbitmq.client.Channel;
import org.springframework.amqp.core.Message;

import javax.annotation.Resource;
import java.io.IOException;

/*
@description:  这个就是在监听这个普通队列中的消息,来进行消费;核心的业务逻辑就在这里
               但是这里又分了两种情况,第一种情况就是用户主动关单,订单模块在执行关单操作的时候会主动发送一条消息到MQ来解锁库存;
                                  第二种情况就是支付超时了,当订单在创建的时候我们在MQ种发了一条消息,如果30分钟之后还没有支付,我们就要解锁库存
                                  像当于是第一种是一种主动的解锁，第二种是一种补偿机制
@ClassName StockReleaseListener
@author Chen
@create 2023-06-18 15:42
@Version 1.0
*/
@Slf4j
@Service
@RabbitListener(queues = "stock.release.stock.queue")
public class StockReleaseListener {


    @Resource
    WareSkuService wareSkuService;

    /*
     * @param to
     * @param message
     * @param channel
     * @==============History===============<br/>
     * @Description //   这个队列里的消息是在订单创建的时候锁定库存的时候来发送的消息
     * @Date 2023/6/18 2023/6/18 
     * @Author < a href="2277411582@qq.com">chen</ a>
     * @return void
     */
    @RabbitHandler
    public void handleStockLockedRelease(StockLockedTo to, Message message, Channel channel) throws IOException {
        log.info("收到解锁库存的消息......");
        try{
            // 当前消息是否被第二次及以后（重新）派发过来了。
            wareSkuService.unlockStock(to);
            channel.basicAck(message.getMessageProperties().getDeliveryTag(),false);
        }catch (Exception e){
            channel.basicReject(message.getMessageProperties().getDeliveryTag(),true);
        }

    }

    /*
     * @param orderTo
     * @param message
     * @param channel
     * @==============History===============<br/>
     * @Description //   订单关闭时,订单模块会直接发送一条消息
     * @Date 2023/6/18 2023/6/18 
     * @Author < a href="2277411582@qq.com">chen</ a>
     * @return void
     */
    @RabbitHandler
    public void handleOrderCloseRelease(OrderTo orderTo, Message message, Channel channel) throws IOException {
        log.info("订单关闭准备解锁库存...");
        try{
            wareSkuService.unlockStock(orderTo);
            channel.basicAck(message.getMessageProperties().getDeliveryTag(),false);
        }catch (Exception e){
            channel.basicReject(message.getMessageProperties().getDeliveryTag(),true);
        }

    }


}
